// 1：用变量来定义一个函数类型，就像这个样子
let add5: (x: number, y: number) => number;

// 2：用接口定义函数
interface AddInterface {
  // 不需要指定函数的名称，直接定义它的参数类型
  (x: number, y: number): number;
}

// 还有一种更简洁的方式定义函数就是使用【类型别名】，类型别名呢就是为我们这个函数起一个名字它的名字就是 AddType
type AddType = (x: number, y: number) => number;

// 上面这三种的定义方式是等价的

// 然后我们来实现具体的函数

let addFunc: AddInterface = (a, b) => a + b;

console.log("add：", addFunc(1, 2));

// 混合类型的接口【一个接口即可以定义一个函数也可以像对象一样拥有属性和方法】

// 下面我们用混合接口来定义一个类库
interface Lib {
  (): void; // 没有参数也没有返回值
  version: string; // 版本号
  doSomething(): void; // 方法
}

function getLib(){
  // 指定lib方法的类型是 Lib 还需要在使用 as 类型断言
  let lib: Lib = (() => {}) as Lib
  lib.version = '1.0';
  lib.doSomething = () => {}
  return lib;
}

let lib1 = getLib();
lib1();
lib1.doSomething();

let lib2 = getLib();

